home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1992 June: ROMin Holiday / ADC Developer CD (1992-06) (''ROMin Holiday'')_iso / Developer Connection - 06-1992.iso / Periodicals / develop / develop 1 code / dynamo / rt.a < prev    next >
Encoding:
Text File  |  1989-12-10  |  17.9 KB  |  1,438 lines  |  [TEXT/MPS ]

  1. *******************************************************
  2. *                        *
  3. * DYNAMO                        *
  4. *                        *
  5. * Apple II 8-bit runtime library routines.        *
  6. * Copyright (C) 1989 Apple Computer.        *
  7. *                        *
  8. * Written by Eric Soldan, Apple II DTS        *
  9. *                        *
  10. *******************************************************
  11.  
  12.         include    'sys.equ'
  13.         include    'app.config'
  14.  
  15. vsl        equ    varstart
  16. vsh        equ    varstart+hibyte
  17.  
  18. ******************
  19.  
  20.         export    rtreset
  21. rtreset        proc
  22.         export    numtocopy, chrhibiton, chrhibitoff
  23.         export    sign, readendchr, hexpadchr, padhex
  24.         ldy    #255
  25.         sty    numtocopy
  26.         sty    chrhibitoff
  27.         iny
  28.         sty    chrhibiton
  29.         sty    sign
  30.         sty    readendchr
  31.         lda    #'0'
  32.         sta    hexpadchr
  33.         lsr    padhex
  34.         rts
  35. numtocopy    dc.b    255        ;Will be set back to 255 after
  36.                     ;every string copy or append.
  37. chrhibitoff    dc.b    $FF
  38. chrhibiton    dc.b    0
  39. sign        dc.b    0
  40. readendchr    dc.b    0
  41. hexpadchr    dc.b    '0'
  42. padhex        dc.b    0
  43.         endp
  44.  
  45. ***
  46.  
  47.         export    hibitchrs
  48. hibitchrs    PROC
  49.  
  50.         lda    #$80        ;We don't need to set chrhibitoff
  51.         sta    chrhibiton    ;because it will either be a $7F
  52.         rts            ;or $FF, and in either case
  53.         endp            ;chrhibiton will turn it on anyway.
  54.  
  55. ***
  56.  
  57.         export    lowbitchrs
  58. lowbitchrs    PROC
  59.  
  60.         asl    chrhibiton    ;Was a $00 or $80, so this makes it $00.
  61.         lda    #$7F
  62.         sta    chrhibitoff
  63.         rts
  64.         endp
  65.  
  66. ***
  67.  
  68.         export    regchrs
  69. regchrs        PROC
  70.  
  71.         asl    chrhibiton
  72.         lda    #$FF
  73.         sta    chrhibitoff
  74.         rts
  75.         endp
  76.  
  77. ***
  78.  
  79.         export    rtcout
  80. rtcout        proc
  81.  
  82.         stx    @keepx
  83.         and    chrhibitoff
  84.         ora    chrhibiton
  85.         jsr    $FDED
  86.         ldx    @keepx
  87.         rts
  88. @keepx        dc.b    0
  89.         endp
  90.  
  91. ***
  92.  
  93.         export    write
  94. write        proc
  95.         pla
  96.         sta    @getchr+1
  97.         pla
  98.         sta    @getchr+2
  99.         txa
  100.         pha
  101. @loop        inc    @getchr+1
  102.         bne    @getchr
  103.         inc    @getchr+2
  104. @getchr        lda    $2000        ;Address modified.
  105.         beq    @exit
  106.         jsr    rtcout
  107.         jmp    @loop
  108. @exit        pla
  109.         tax
  110.         lda    @getchr+2
  111.         pha
  112.         lda    @getchr+1
  113.         pha
  114.         rts
  115.         endp
  116.  
  117. ***
  118.  
  119.         export    writecr
  120. writecr        proc
  121.         txa
  122.         pha
  123.         lda    #13
  124.         jsr    rtcout
  125.         pla
  126.         tax
  127.         rts
  128.         endp
  129.  
  130. ***
  131.  
  132.         export    wrcstr
  133. wrcstr        proc
  134.         sta    @getchr+1
  135.         sty    @getchr+2
  136.         txa
  137.         pha
  138. @getchr        lda    $2000        ;Address modified.        
  139.         beq    @exit
  140.         jsr    rtcout
  141.         inc    @getchr+1
  142.         bne    @getchr
  143.         inc    @getchr+2
  144.         bne    @getchr        ;Always.
  145. @exit        pla
  146.         tax
  147.         rts
  148.         endp
  149.  
  150. ***
  151. ***
  152. ***
  153.  
  154.         export    signed
  155. signed        proc
  156.         sec
  157.         ror    sign
  158.         rts
  159.         endp
  160.  
  161. ***
  162.  
  163.         export    unsigned
  164. unsigned        proc
  165.         lsr    sign
  166.         rts
  167.         endp
  168.  
  169. ***
  170.  
  171.         export    chngsgn
  172. chngsgn        proc
  173.         lda    vsl,x
  174.         eor    #$FF
  175.         clc
  176.         adc    #1
  177.         sta    vsl,x
  178.         lda    vsh,x
  179.         eor    #$FF
  180.         adc    #0
  181.         sta    vsh,x
  182.         rts
  183.         endp
  184.  
  185. ***
  186.  
  187.         export    decoutl
  188. decoutl        proc
  189.         import    decout
  190.         ldy    #0
  191.         jmp    decout        ;jmp, instead of beq so we can be a lib.
  192.         endp
  193.  
  194. ***
  195.  
  196.         export    vdecout
  197. vdecout        proc
  198.         export    decout
  199.         lda    vsh,x
  200.         tay
  201.         lda    vsl,x
  202.  
  203. decout        sta    @templ
  204.         sty    @temph
  205.         lda    #'0'
  206.         sta    @temp2
  207.         txa
  208.         pha
  209.         bit    sign
  210.         bpl    @pos
  211.         tya
  212.         bpl    @pos
  213.         lda    #'-'
  214.         jsr    rtcout
  215.         lda    @templ
  216.         eor    #$FF
  217.         clc
  218.         adc    #1
  219.         sta    @templ
  220.         lda    @temph
  221.         eor    #$FF
  222.         adc    #0
  223.         sta    @temph
  224. @pos        ldx    #4
  225. @a        lda    #'0'
  226.         sta    @temp
  227. @b        lda    @templ
  228.         sec
  229.         sbc    @decl,x
  230.         tay
  231.         lda    @temph
  232.         sbc    @dech,x
  233.         bcc    @c
  234.         sta    @temph
  235.         sty    @templ
  236.         inc    @temp
  237.         bcs    @b
  238. @c        lda    @temp
  239.         dex
  240.         bmi    @e        ;Last digit -- print no matter what.
  241.         cmp    @temp2
  242.         beq    @a        ;Don't print leading 0's.
  243.         lsr    @temp2        ;Inval leading 0 test.
  244.         jsr    rtcout
  245.         jmp    @a
  246. @e        jsr    rtcout
  247.         pla
  248.         tax
  249.         rts
  250. @decl        dc.b    1
  251.         dc.b    10
  252.         dc.b    100
  253.         dc.b    1000-768
  254.         dc.b    10000-9984
  255. @dech        dc.b    1>>8
  256.         dc.b    10>>8
  257.         dc.b    100>>8
  258.         dc.b    1000>>8
  259.         dc.b    10000>>8
  260. @templ        dc.b    0
  261. @temph        dc.b    0
  262. @temp        dc.b    0
  263. @temp2        dc.b    0
  264.         endp
  265.  
  266. ***
  267.  
  268.         export    hexpad
  269. hexpad        proc
  270.         sta    hexpadchr
  271.         lsr    padhex
  272.         rts
  273.         endp
  274.  
  275. ***
  276.  
  277.         export    hexnopad
  278. hexnopad        proc
  279.         sec
  280.         ror    padhex
  281.         rts
  282.         endp
  283.  
  284. ***
  285.  
  286.         export    hexoutl
  287. hexoutl        proc
  288.         import    hexout
  289.         ldy    #0
  290.         clc
  291.         jmp    hexout+1        ;jmp, instead of beq so we can be a lib.
  292.         endp
  293.  
  294. ***
  295.  
  296.         export    vhexout
  297. vhexout        proc
  298.         export    hexout
  299.         import    hexpadchr
  300.         lda    vsh,x
  301.         tay
  302.         lda    vsl,x
  303.  
  304. hexout        sec
  305.         sta    @templ
  306.         txa
  307.         pha
  308.         ldx    #3
  309.         bcs    @aa
  310.         ldx    #1
  311.         ldy    @templ
  312. @aa        sty    @temph
  313.         lda    padhex
  314.         sta    @padhex
  315.         lda    hexpadchr
  316.         sta    @hexpadchr
  317. @loop        lda    #0
  318.         ldy    #4
  319. @a        asl    @templ
  320.         rol    @temph
  321.         rol    a
  322.         dey
  323.         bne    @a
  324.         tay
  325.         bne    @b
  326.         lda    @padhex
  327.         bmi    @nopad
  328.         lda    @hexpadchr
  329.         jsr    rtcout
  330.         jmp    @nopad
  331. @b        jsr    @doone
  332.         lsr    @padhex
  333.         lda    #'0'
  334.         sta    @hexpadchr
  335. @nopad        dex
  336.         bne    @loop
  337.         lda    @temph
  338.         lsr    a
  339.         lsr    a
  340.         lsr    a
  341.         lsr    a
  342.         tay
  343.         pla
  344.         tax
  345. @doone        lda    @hexdigit,y
  346.         jmp    rtcout
  347. @hexdigit    dc.b    '0123456789ABCDEF'
  348. @padhex        dc.b    0
  349. @hexpadchr    dc.b    0
  350. @templ        dc.b    0
  351. @temph        dc.b    0
  352.         endp
  353.  
  354. ***
  355.  
  356.         export    ldyvar
  357. ldyvar        proc
  358.         lda    vsl,y
  359.         pha
  360.         lda    vsh,y
  361.         tay
  362.         pla
  363.         rts
  364.         endp
  365.  
  366. ***
  367.  
  368.         export    mulconl
  369. mulconl        proc
  370.         import    mulcon
  371.         ldy    #0
  372.         jmp    mulcon        ;jmp, instead of beq so we can be a lib.
  373.         endp
  374.  
  375. ***
  376.  
  377.         export    mulvar
  378. mulvar        proc
  379.         export    mulcon, mulvall, mulvalh
  380.         import    multiply, setcon
  381.         jsr    ldyvar
  382.  
  383. mulcon        pha
  384.         lda    vsl,x
  385.         sta    mulvall
  386.         lda    vsh,x
  387.         sta    mulvalh
  388.         pla
  389.         jsr    multiply
  390.         jmp    setcon
  391. mulvall        dc.b    0
  392. mulvalh        dc.b    0
  393.         endp
  394.  
  395.         export    multiply
  396. multiply        proc
  397.         sta    @templ
  398.         sty    @temph
  399.         lda    #0
  400.         tay
  401. @a        lsr    mulvalh
  402.         ror    mulvall
  403.         bcc    @b
  404.         clc
  405.         adc    @templ
  406.         pha
  407.         tya
  408.         adc    @temph
  409.         tay
  410.         pla
  411. @b        asl    @templ
  412.         rol    @temph
  413.         pha
  414.         lda    mulvalh
  415.         ora    mulvall
  416.         cmp    #1
  417.         pla
  418.         bcs    @a
  419.         rts
  420. @templ        dc.b    0
  421. @temph        dc.b    0
  422.         endp
  423.  
  424.         export    divconl
  425. divconl        proc
  426.         import    divcon
  427.         ldy    #0
  428.         jmp    divcon        ;jmp, instead of beq so we can be a lib.
  429.         endp
  430.  
  431. ***
  432.  
  433.         export    divvar
  434. divvar        proc
  435.         export    divcon
  436.         import    ldyvar
  437.         jsr    ldyvar
  438.  
  439. divcon        sta    @templ
  440.         sty    @temph
  441.         lda    #16
  442.         sta    @temp
  443.         lda    #0
  444.         sta    @temp2
  445.         sta    @temp3
  446. @a        asl    vsl,x
  447.         rol    vsh,x
  448.         rol    @temp2
  449.         rol    @temp3
  450.         lda    @temp2
  451.         sec
  452.         sbc    @templ
  453.         sta    @temp4
  454.         lda    @temp3
  455.         sbc    @temph
  456.         bcc    @b
  457.         sta    @temp3
  458.         lda    @temp4
  459.         sta    @temp2
  460.         inc    vsl,x
  461. @b        dec    @temp
  462.         bne    @a
  463.         lda    @temp2
  464.         ldy    @temp3
  465.         rts
  466. @templ        dc.b    0
  467. @temph        dc.b    0
  468. @temp        dc.b    0
  469. @temp2        dc.b    0
  470. @temp3        dc.b    0
  471. @temp4        dc.b    0
  472.         endp
  473.  
  474. ***
  475.  
  476.         export    addvar
  477. addvar        proc
  478.         export    addcon
  479.         import    ldyvar
  480.         jsr    ldyvar
  481.  
  482. addcon        pha
  483.         clc
  484.         adc    vsl,x
  485.         sta    vsl,x
  486.         tya
  487.         adc    vsh,x
  488.         sta    vsh,x
  489.         pla
  490.         rts
  491.         endp
  492.  
  493. ***
  494.  
  495.         export    addconl
  496. addconl        proc
  497.         ldy    #0
  498.         jmp    addcon        ;jmp, instead of beq so we can be a lib.
  499.         endp
  500.  
  501. ***
  502.  
  503.         export    subvar
  504. subvar        proc
  505.         export    subcon
  506.         import    ldyvar
  507.         jsr    ldyvar
  508.  
  509. subcon        pha
  510.         sta    @temp
  511.         lda    vsl,x
  512.         sec
  513.         sbc    @temp
  514.         sta    vsl,x
  515.         sty    @temp
  516.         lda    vsh,x
  517.         sbc    @temp
  518.         sta    vsh,x
  519.         pla
  520.         rts
  521. @temp        dc.b    0
  522.         endp
  523.  
  524. ***
  525.  
  526.         export    subconl
  527. subconl        proc
  528.         ldy    #0
  529.         jmp    subcon        ;jmp, instead of beq so we can be a lib.
  530.         endp
  531.  
  532. ***
  533.  
  534.         export    setconl
  535. setconl        proc
  536.         export    setcon
  537.         ldy    #0
  538.  
  539. setcon        sta    vsl,x
  540.         pha
  541.         tya
  542.         sta    vsh,x
  543.         pla
  544.         rts
  545.         endp
  546.  
  547. ***
  548.  
  549.         export    setzero
  550. setzero        proc
  551.         lda    #0
  552.         sta    vsh,x
  553.         sta    vsl,x
  554.         rts
  555.         endp
  556.  
  557. ***
  558.  
  559.         export    seteq
  560. seteq        proc
  561.         lda    vsh,y
  562.         sta    vsh,x
  563.         lda    vsl,y
  564.         sta    vsl,x
  565.         rts
  566.         endp
  567.  
  568. ***
  569.  
  570.         export    setvars
  571. setvars        proc
  572.         pla
  573.         sta    @getval+1
  574.         pla
  575.         sta    @getval+2
  576.         txa
  577.         pha
  578.         ldy    #1
  579. @loop        jsr    @getval
  580.         cmp    #255
  581.         beq    @exit
  582.         tax
  583.         jsr    @getval
  584.         sta    vsl,x
  585.         jsr    @getval
  586.         sta    vsh,x
  587.         bcc    @loop        ;Always.
  588. @exit        pla
  589.         tax
  590.         lda    @getval+2
  591.         pha
  592.         lda    @getval+1
  593.         pha
  594.         rts
  595. @getval        lda    $2000,y        ;Address modified.
  596.         inc    @getval+1
  597.         bne    @rts
  598.         inc    @getval+2
  599. @rts        rts
  600.         endp
  601.  
  602. ***
  603.  
  604.         export    xgty
  605. xgty        proc
  606.         import    vifequal, vifsgneq, xlty0
  607.         tya
  608.         pha
  609.         lda    sign
  610.         bpl    @a
  611.         jsr    vifsgneq
  612.         jmp    @b
  613. @a        jsr    vifequal
  614. @b        pla
  615.         tay
  616.         bcs    @rts
  617.         jmp    xlty0        ;jmp, instead of bcc so we can be a lib.
  618. @rts        rts
  619.         endp
  620.  
  621. ***
  622.  
  623.         export    xlty
  624. xlty        proc
  625.         export    xlty0
  626.         import    vifequal, vifsgneq
  627.         tya
  628.         pha
  629.         lda    sign
  630.         bpl    @a
  631.         jsr    vifsgneq
  632.         jmp    @b
  633. @a        jsr    vifequal
  634. @b        pla
  635.         tay
  636.         bcc    xltyrts
  637. xlty0        lda    vsl,x
  638.         pha
  639.         lda    vsl,y
  640.         sta    vsl,x
  641.         pla
  642.         sta    vsl,y
  643.         lda    vsh,x
  644.         pha
  645.         lda    vsh,y
  646.         sta    vsh,x
  647.         pla
  648.         sta    vsh,y
  649. xltyrts        rts
  650.         endp
  651.  
  652. ***
  653.  
  654.         export    ifequal
  655. ifequal        proc
  656.         sta    @lo
  657.         sty    @hi
  658.         lda    vsh,x
  659.         cmp    @hi
  660.         bne    @exit
  661.         lda    vsl,x
  662.         cmp    @lo
  663. @exit        php
  664.         lda    @lo
  665.         plp
  666.         rts            ;eq=eq, cs>=, cc<
  667. @lo        dc.b    0
  668. @hi        dc.b    0
  669.         endp
  670.  
  671. ***
  672.  
  673.         export    vifequal
  674. vifequal        proc
  675.         lda    vsl,y        ;Load up the variable value and go do it.
  676.         pha
  677.         lda    vsh,y
  678.         tay
  679.         pla
  680.         jmp    ifequal
  681.         endp
  682.  
  683. ***
  684.  
  685.         export    ifsgneq
  686. ifsgneq        proc
  687.         sta    @lo        ;Preserve acc.
  688.         tya
  689.         cmp    #$80        ;See if right-side is negative.
  690.         eor    vsh,x        ;See if signs are the same.
  691.         bmi    @exit        ;xreg variable is smaller (signed).
  692.         bcs    @a        ;xreg variable is negative.
  693.         jmp    ifequal        ;xreg variable is positive.
  694. @a        jsr    ifequal
  695.         beq    @rts        ;xreg variable is equal.
  696.         ror    a
  697.         eor    #$80
  698.         sec            ;not equal status.
  699.         rol    a
  700. @exit        php
  701.         lda    @lo
  702.         plp
  703. @rts        rts            ;eq=eq, cs>=, cc<
  704. @lo        dc.b    0
  705.         endp
  706.  
  707. ***
  708.  
  709.         export    vifsgneq
  710. vifsgneq        proc
  711.         lda    vsl,y        ;Load up the variable value and go do it.
  712.         pha
  713.         lda    vsh,y
  714.         tay
  715.         pla
  716.         jmp    ifsgneq
  717.         endp
  718.  
  719. ***
  720.  
  721.         export    seedrandom
  722. seedrandom    proc
  723.         export    randomval
  724.         adc    $C02E        ;Video counter.
  725.         pha
  726.         tya
  727.         adc    $C02E
  728.         tay
  729.         bne    @a
  730.         iny
  731. @a        pla
  732.         bne    @b
  733.         adc    #1
  734. @b        sta    randomval
  735.         sty    randomval+1
  736.         rts
  737. randomval    dc.w    0
  738.         endp
  739.  
  740. ***
  741.  
  742.         export    calcrandom
  743. calcrandom    proc
  744.         stx    @keepx        ;Keep this so we can restore the xreg.
  745.  
  746.         tax            ;Use 1 less than limit, so that we can
  747.         bne    @a        ;compute the smallest mask possible.  This
  748.         dey            ;way, if we are passed $100, we won't
  749. @a        dex            ;compute a mask of $1FF.
  750.         stx    @rndlimit    ;The carry was set by cmp #0, so the 
  751.         sty    @rndlimit+1    ;sbc #1 is okay.
  752.  
  753. * Figure a mask that is larger than or equal to the rndlimit (minus 1).  This will be
  754. * used against the calculated randomval before it is compared to the rndlimit.  If the
  755. * randomval is still too large, then we will get another.
  756.         ldx    #0
  757.         lda    @rndlimit+1
  758.         beq    @c        ;No hi-byte, so work on low-byte.
  759.         txa
  760.         inx
  761. @c        sec
  762.         rol    a
  763.         cmp    @rndlimit,x
  764.         bcc    @c
  765.         sta    @maskl,x
  766.         txa
  767.         eor    #1
  768.         tax
  769.         sbc    #1        ;Carry set.
  770.         sta    @maskl,x
  771.  
  772. @recalc        ldy    #19
  773. @d        asl    randomval
  774.         rol    randomval+1
  775.         bcc    @e
  776.         lda    randomval
  777.         eor    #$87
  778.         sta    randomval
  779.         lda    randomval+1
  780.         eor    #$1D
  781.         sta    randomval+1
  782. @e        dey
  783.         bne    @d
  784.  
  785.         ldy    randomval+1
  786.         ldx    randomval
  787.         bne    @f
  788.         dey
  789. @f        dex
  790.         tya
  791.         and    @maskh
  792.         tay
  793.         txa
  794.         and    @maskl
  795.         cpy    @rndlimit+1
  796.         bcc    @g
  797.         bne    @recalc
  798.         cmp    @rndlimit
  799.         bcc    @g
  800.         bne    @recalc
  801. @g        ldx    @keepx
  802.         rts
  803. @rndlimit    dc.w    0
  804. @keepx        dc.b    0
  805. @maskl        dc.b    0
  806. @maskh        dc.b    0
  807.         endp
  808.  
  809. ***
  810. ***
  811. ***
  812.  
  813.         export    strval
  814. strval        proc
  815.         export    midstrval
  816.         import    strinfo, strsign, strlen, currentstr, nextchr
  817.         ldy    #0
  818. midstrval    jsr    strinfo
  819.         sta    @getchr+1
  820.         stx    @getchr+2
  821.         lda    #0
  822.         sta    strsign
  823.         sta    @temp
  824.         sta    @temp2
  825.         cpy    strlen
  826.         bcs    @exit        ;Indexed out of string at start.
  827.         jsr    @getchr        ;Decimal or hex...
  828.         cmp    #'$'
  829.         beq    @hex
  830. @a        cpy    strlen
  831.         bcs    @exit
  832.         jsr    @getchr
  833.         cmp    #'-'
  834.         bne    @b
  835.         lda    @temp
  836.         ora    @temp2
  837.         bne    @exit
  838.         inc    strsign        ;Negative number.
  839.         iny
  840.         bcs    @a        ;Always.
  841. @b        cmp    #'0'
  842.         bcc    @exit
  843.         cmp    #'9'+1
  844.         bcs    @exit
  845.         iny
  846.         sbc    #47        ;cclear
  847.         pha
  848.         ldx    @temp2        ;Multiply by 10.
  849.         lda    @temp
  850.         asl    a
  851.         rol    @temp2
  852.         asl    a
  853.         rol    @temp2
  854.         adc    @temp
  855.         sta    @temp
  856.         txa
  857.         adc    @temp2
  858.         asl    @temp
  859.         rol    a
  860.         sta    @temp2
  861.         pla
  862.         adc    @temp
  863.         sta    @temp
  864.         bcc    @a
  865.         inc    @temp2
  866.         bcs    @a        ;Always.
  867. @exit        sty    nextchr        ;Save next character location.
  868.         ldx    currentstr
  869.         lda    @temp        ;Return value in acc,yreg.
  870.         ldy    @temp2
  871.         ror    strsign        ;Should be negative.
  872.         bcc    @rts
  873.         eor    #$FF
  874.         adc    #0        ;cset
  875.         pha
  876.         tya
  877.         eor    #$FF
  878.         adc    #0
  879.         tay
  880.         pla
  881. @rts        rts
  882. @getchr        lda    $2000,y        ;Address modified.
  883.         rts
  884. @hex        iny
  885.         cpy    strlen
  886.         bcs    @exit
  887.         jsr    @getchr
  888.         cmp    #'0'
  889.         bcc    @exit
  890.         cmp    #'9'+1
  891.         bcc    @hexdigit
  892.         and    #$5F
  893.         cmp    #'A'
  894.         bcc    @exit
  895.         cmp    #'Z'+1
  896.         bcs    @exit
  897.         sbc    #6        ;Carry clear.
  898. @hexdigit    asl    @temp
  899.         rol    @temp2
  900.         asl    @temp
  901.         rol    @temp2
  902.         asl    @temp
  903.         rol    @temp2
  904.         asl    @temp
  905.         rol    @temp2
  906.         and    #$0F
  907.         ora    @temp
  908.         sta    @temp
  909.         jmp    @hex
  910. @temp        dc.b    0
  911. @temp2        dc.b    0
  912.         endp
  913.  
  914. ***
  915.  
  916.  
  917.         export    strinfo
  918. strinfo        proc
  919.         export    currentstr, strlen, maxstrlen, numchrs
  920.         export    strsign, nextchr
  921.         import    strlens, maxstrlens, strlocs, numtocopy
  922.         stx    currentstr
  923.         lda    strlens,x    ;String number in xreg.
  924.         sta    strlen
  925.         lda    maxstrlens,x
  926.         sta    maxstrlen
  927.         txa
  928.         asl    a
  929.         tax
  930.         bcs    @a
  931.         lda    strlocs,x
  932.         pha
  933.         lda    strlocs+1,x
  934.         tax
  935.         pla
  936.         rts
  937. @a        lda    strlocs+$100,x
  938.         pha
  939.         lda    strlocs+$101,x
  940.         tax
  941.         pla
  942.         rts
  943. currentstr    dc.b    0
  944. strlen        dc.b    0
  945. maxstrlen    dc.b    0
  946. numchrs        dc.b    0
  947. strsign        dc.b    0
  948. nextchr        dc.b    0
  949.         endp
  950.  
  951. ***
  952.  
  953.         export    prstr
  954. prstr        proc
  955.         lda    #255        ;xreg=str -- write entire string.
  956.         export    prleftstr, prmidstr
  957.  
  958. prleftstr    ldy    #0        ;xreg=str, acc=numChrs
  959.  
  960. prmidstr        cmp    #0
  961.         beq    @exit
  962.         sta    numchrs        ;xreg=str, acc=numChrs, yreg=starting chr.
  963.         jsr    strinfo
  964.         sta    @getchr+1
  965.         stx    @getchr+2
  966. @loop        cpy    strlen
  967.         bcs    @exit
  968.         tya
  969.         pha
  970. @getchr        lda    $2000,y        ;Address modified.
  971.         jsr    rtcout
  972.         pla
  973.         tay
  974.         iny
  975.         dec    numchrs
  976.         bne    @loop
  977. @exit        ldx    currentstr
  978.         rts
  979.         endp
  980.  
  981. ***
  982.  
  983.         export    leftstrcpy
  984. leftstrcpy    proc
  985.         export    strcpy, midstrcpy
  986.         import    numtocopy, copystr
  987.         sta    numtocopy    ;Number to copy in acc.
  988.  
  989. strcpy        lda    #0        ;Copy entire string.
  990.  
  991. midstrcpy    clc            ;String offset in acc.
  992.         jmp    copystr        ;jmp, instead of bcc so we can be a lib.
  993.         endp
  994.  
  995. ***
  996.  
  997.         export    leftstrcat
  998. leftstrcat    proc
  999.         export    strcat, midstrcat, copystr
  1000.         import    strlens, strlocs
  1001.         sta    numtocopy    ;Number to append in acc.
  1002.  
  1003. strcat        lda    #0        ;Append entire string.
  1004.  
  1005. midstrcat    sec            ;String offset in acc.
  1006.  
  1007. copystr        pha            ;Keep source offset.
  1008.         php            ;Keep copy or append status.
  1009.         jsr    strinfo
  1010.         sta    @dst+1
  1011.         stx    @dst+2
  1012.         lda    strlens,y
  1013.         sta    @srcstrlen
  1014.         tya
  1015.         asl    a
  1016.         tay
  1017.         bcs    @a
  1018.         lda    strlocs,y
  1019.         sta    @src+1
  1020.         lda    strlocs+1,y
  1021.         sta    @src+2
  1022.         bcc    @b
  1023. @a        lda    strlocs+$100,y
  1024.         sta    @src+1
  1025.         lda    strlocs+$101,y
  1026.         sta    @src+2
  1027. @b        ldx    #0
  1028.         plp            ;Get copy or append status.
  1029.         bcc    @c        ;Copy status.
  1030.         ldx    strlen        ;Append status.
  1031. @c        pla
  1032.         tay            ;Source offset.
  1033. @loop        cpy    @srcstrlen
  1034.         bcs    @exit
  1035.         cpx    maxstrlen
  1036.         bcs    @exit
  1037. @src        lda    $2000,y        ;Address modified.
  1038. @dst        sta    $2000,x        ;Address modified.
  1039.         inx
  1040.         iny
  1041.         dec    numtocopy
  1042.         bne    @loop
  1043. @exit        lda    #255        ;Set it back for next midstr operation.
  1044.         sta    numtocopy    ;The next one may only have 3 parameters.
  1045.         txa            ;xreg has destination string length.
  1046.         ldx    currentstr
  1047.         sta    strlens,x
  1048.         rts
  1049. @srcstrlen    dc.b    0
  1050.         endp
  1051.  
  1052. ***
  1053.  
  1054.         export    litstr
  1055. litstr        proc
  1056.         import    strlens
  1057.         pla
  1058.         sta    @getchr+1
  1059.         pla
  1060.         sta    @getchr+2
  1061.         jsr    strinfo
  1062.         sta    @putchr+1
  1063.         stx    @putchr+2
  1064.         ldy    #0
  1065. @loop        inc    @getchr+1
  1066.         bne    @getchr
  1067.         inc    @getchr+2
  1068. @getchr        lda    $2000        ;Address modified.
  1069.         beq    @exit
  1070.         cpy    maxstrlen
  1071.         bcs    @loop
  1072. @putchr        sta    $2000,y
  1073.         iny
  1074.         bne    @loop
  1075. @exit        lda    @getchr+2
  1076.         pha
  1077.         lda    @getchr+1
  1078.         pha
  1079.         ldx    currentstr
  1080.         tya
  1081.         sta    strlens,x
  1082.         rts
  1083.         endp
  1084.  
  1085. ***
  1086.  
  1087.         export    strchr
  1088. strchr        proc
  1089.         tay
  1090.         jsr    strinfo
  1091.         sta    @getchr+1
  1092.         stx    @getchr+2
  1093. @getchr        lda    $2000,y
  1094.         ldx    currentstr
  1095.         rts
  1096.         endp
  1097.  
  1098. ***
  1099.  
  1100.         export    strloc
  1101. strloc        proc
  1102.         jsr    strinfo
  1103.         pha
  1104.         txa
  1105.         tay
  1106.         ldx    currentstr
  1107.         pla
  1108.         rts
  1109.         endp
  1110.  
  1111. ***
  1112. ***
  1113. ***
  1114.  
  1115.         export    restore
  1116. restore        proc
  1117.         import    getdatabyte
  1118.         sta    getdatabyte+1
  1119.         sty    getdatabyte+2
  1120.         rts
  1121.         endp
  1122.  
  1123. ***
  1124.  
  1125.         export    getdatabyte
  1126. getdatabyte    proc
  1127.         lda    $2000
  1128.         inc    getdatabyte+1
  1129.         bne    @rts
  1130.         inc    getdatabyte+2
  1131. @rts        rts
  1132.         endp
  1133.  
  1134. ***
  1135.  
  1136.         export    readint
  1137. readint        proc
  1138.         jsr    getdatabyte
  1139.         sta    vsl,x
  1140.         pha
  1141.         jsr    getdatabyte
  1142.         sta    vsh,x
  1143.         tay
  1144.         pla
  1145.         rts
  1146.         endp
  1147.  
  1148. ***
  1149.  
  1150.         export    readstr
  1151. readstr        proc
  1152.         import    strlens
  1153.         jsr    strinfo
  1154.         sta    @putchr+1
  1155.         stx    @putchr+2
  1156.         ldy    #0
  1157. @loop        jsr    getdatabyte
  1158.         cmp    readendchr
  1159.         beq    @exit
  1160.         cpy    maxstrlen
  1161.         bcs    @loop
  1162. @putchr        sta    $2000,y
  1163.         iny
  1164.         bne    @loop
  1165. @exit        ldx    currentstr
  1166.         tya
  1167.         sta    strlens,x
  1168.         rts
  1169.         endp
  1170.  
  1171. ***
  1172.  
  1173.         export    readend
  1174. readend        proc
  1175.         sta    readendchr
  1176.         rts
  1177.         endp
  1178.  
  1179. ***
  1180. ***
  1181. ***
  1182.  
  1183.         export    arraybase
  1184. arraybase    proc
  1185.         export    arrayloc1, arrayloc2, arrayloc3
  1186.         export    arrayloc0l, arrayloc0h
  1187.         export    arrayloc1l, arrayloc1h
  1188.         export    arrayloc2l, arrayloc2h
  1189.         export    arrayloc3l, arrayloc3h
  1190.         sta    arrayloc0l
  1191.         sty    arrayloc0h
  1192. arrayloc1    sta    arrayloc1l
  1193.         sty    arrayloc1h
  1194. arrayloc2    sta    arrayloc2l
  1195.         sty    arrayloc2h
  1196. arrayloc3    sta    arrayloc3l
  1197.         sty    arrayloc3h
  1198.         sta    aptr
  1199.         sty    aptr+1
  1200.         rts
  1201. arrayloc0l    dc.b    0
  1202. arrayloc0h    dc.b    0
  1203. arrayloc1l    dc.b    0
  1204. arrayloc1h    dc.b    0
  1205. arrayloc2l    dc.b    0
  1206. arrayloc2h    dc.b    0
  1207. arrayloc3l    dc.b    0
  1208. arrayloc3h    dc.b    0
  1209.         endp
  1210.  
  1211. ***
  1212.  
  1213.         export    dim1size
  1214. dim1size        proc
  1215.         export    dim2size, dim3size
  1216.         export    dim1sizel, dim1sizeh
  1217.         export    dim2sizel, dim2sizeh
  1218.         export    dim3sizel, dim3sizeh
  1219.         sta    dim1sizel
  1220.         sty    dim1sizeh
  1221. dim2size        sta    dim2sizel
  1222.         sty    dim2sizeh
  1223. dim3size        sta    dim3sizel
  1224.         sty    dim3sizeh
  1225.         rts
  1226. dim1sizel    dc.b    0
  1227. dim1sizeh    dc.b    0
  1228. dim2sizel    dc.b    0
  1229. dim2sizeh    dc.b    0
  1230. dim3sizel    dc.b    0
  1231. dim3sizeh    dc.b    0
  1232.         endp
  1233.  
  1234. ***
  1235.  
  1236.         export    varyindx1
  1237. varyindx1    proc
  1238.         export    arrayindx1
  1239.         lda    vsl,y
  1240.         pha
  1241.         lda    vsh,y
  1242.         tay
  1243.         pla
  1244.  
  1245. arrayindx1    sta    mulvall
  1246.         sty    mulvalh
  1247.         lda    dim1sizel
  1248.         ldy    dim1sizeh
  1249.         jsr    multiply
  1250.         clc
  1251.         adc    arrayloc0l
  1252.         pha
  1253.         tya
  1254.         adc    arrayloc0h
  1255.         tay
  1256.         pla
  1257.         jmp    arrayloc1
  1258.         endp
  1259.  
  1260. ***
  1261.  
  1262.         export    varyindx2
  1263. varyindx2    proc
  1264.         export    arrayindx2
  1265.         lda    vsl,y
  1266.         pha
  1267.         lda    vsh,y
  1268.         tay
  1269.         pla
  1270.  
  1271. arrayindx2    sta    mulvall
  1272.         sty    mulvalh
  1273.         lda    dim2sizel
  1274.         ldy    dim2sizeh
  1275.         jsr    multiply
  1276.         clc
  1277.         adc    arrayloc1l
  1278.         pha
  1279.         tya
  1280.         adc    arrayloc1h
  1281.         tay
  1282.         pla
  1283.         jmp    arrayloc2
  1284.         endp
  1285.  
  1286. ***
  1287.  
  1288.         export    varyindx3
  1289. varyindx3    proc
  1290.         export    arrayindx3
  1291.         lda    vsl,y
  1292.         pha
  1293.         lda    vsh,y
  1294.         tay
  1295.         pla
  1296.  
  1297. arrayindx3    sta    mulvall
  1298.         sty    mulvalh
  1299.         lda    dim3sizel
  1300.         ldy    dim3sizeh
  1301.         jsr    multiply
  1302.         clc
  1303.         adc    arrayloc2l
  1304.         pha
  1305.         tya
  1306.         adc    arrayloc2h
  1307.         tay
  1308.         pla
  1309.         jmp    arrayloc3
  1310.         endp
  1311.  
  1312. ***
  1313.  
  1314.         export    vgetelel
  1315. vgetelel        proc
  1316.         export    getelel, getnextelel
  1317.         lda    vsl,y
  1318.         pha
  1319.         lda    vsh,y
  1320.         tay
  1321.         pla
  1322.  
  1323. getelel        clc
  1324.         adc    arrayloc3l
  1325.         sta    aptr
  1326.         tya
  1327.         adc    arrayloc3h
  1328.         sta    aptr+1
  1329. getnextelel    ldy    #0
  1330.         tya
  1331.         sta    vsh,x
  1332.         lda    (aptr),y
  1333.         sta    vsl,x
  1334.         inc    aptr
  1335.         bne    @a
  1336.         inc    aptr+1
  1337. @a        rts
  1338.         endp
  1339.  
  1340. ***
  1341.  
  1342.         export    vgetele
  1343. vgetele        proc
  1344.         export    getele, getnextele
  1345.         lda    vsl,y
  1346.         pha
  1347.         lda    vsh,y
  1348.         tay
  1349.         pla
  1350.  
  1351. getele        asl    a
  1352.         bcc    @a
  1353.         iny
  1354. @a        clc
  1355.         adc    arrayloc3l
  1356.         sta    aptr
  1357.         tya
  1358.         adc    arrayloc3h
  1359.         sta    aptr+1
  1360. getnextele    ldy    #0
  1361.         lda    (aptr),y
  1362.         sta    vsl,x
  1363.         inc    aptr
  1364.         bne    @b
  1365.         inc    aptr+1
  1366. @b        lda    (aptr),y
  1367.         sta    vsh,x
  1368.         inc    aptr
  1369.         bne    @c
  1370.         inc    aptr+1
  1371. @c        tay
  1372.         lda    vsl,x
  1373.         rts
  1374.         endp
  1375.  
  1376. ***
  1377.  
  1378.         export    vputelel
  1379. vputelel        proc
  1380.         export    putelel, putnextelel
  1381.         lda    vsl,y
  1382.         pha
  1383.         lda    vsh,y
  1384.         tay
  1385.         pla
  1386.  
  1387. putelel        clc
  1388.         adc    arrayloc3l
  1389.         sta    aptr
  1390.         tya
  1391.         adc    arrayloc3h
  1392.         sta    aptr+1
  1393. putnextelel    lda    vsl,x
  1394.         ldy    #0
  1395.         sta    (aptr),y
  1396.         inc    aptr
  1397.         bne    @a
  1398.         inc    aptr+1
  1399. @a        rts
  1400.         endp
  1401.  
  1402. ***
  1403.  
  1404.         export    vputele
  1405. vputele        proc
  1406.         export    putele, putnextele
  1407.         lda    vsl,y
  1408.         pha
  1409.         lda    vsh,y
  1410.         tay
  1411.         pla
  1412.  
  1413. putele        asl    a
  1414.         bcc    @a
  1415.         iny
  1416. @a        clc
  1417.         adc    arrayloc3l
  1418.         sta    aptr
  1419.         tya
  1420.         adc    arrayloc3h
  1421.         sta    aptr+1
  1422. putnextele    ldy    #0
  1423.         lda    vsl,x
  1424.         sta    (aptr),y
  1425.         inc    aptr
  1426.         bne    @b
  1427.         inc    aptr+1
  1428. @b        lda    vsh,x
  1429.         sta    (aptr),y
  1430.         inc    aptr
  1431.         bne    @c
  1432.         inc    aptr+1
  1433. @c        tay
  1434.         lda    vsl,x
  1435.         rts
  1436.         endp
  1437.  
  1438.         end